% -*- coding:utf-8 -*-

\section{Backend}
\label{sec:backend}

Una vez que el análisis semántico ha concluído se invoca al backend,
pasándole la tabla de símbolos ya validada.

El backend tan solo se encarga de ejecutar una serie de funciones que
iterarán sobre todos los elementos almacenados en la tabla de
símbolos. Mientras iteran se leen todos los atributos guardados dentro
de la tabla de símbolos y se generan los archivos necesarios para la
salida (tablas en formato \LaTeX y un archivo \emph{dot} temporal para
generar los gráficos).

El código mostrado en el listado ~\ref{lst:generateLink} muestra una
de las funciones a modo de ejemplo, que se encarga de generar la parte
de la salida correspondiente a los enlaces entre redes

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\begin{lstlisting}
  string
  BackendI::generateNets()
  {

    ostringstream netStream;
    map<string, NetworkI*>::iterator netIt;

    for(netIt = _sTable.getNetworks().begin(); netIt != _sTable.getNetworks().end(); netIt++) {
      // Generacion del icono.
      netStream << "\t" << netIt->first << "_icon " << NET_ICON << std::endl;
      
      netStream << "\t" << "subgraph cluster_" << netIt->first << " {" << CLUSTER_ATTR << "; " ;
      netStream << "label=\"" << netIt->first << "\"; " << netIt->first << "_icon};" << std::endl << std::endl;

      // Generacion de una linea para la tabla de redes.
      _nTContentStream << netIt->first << " & " << netIt->second->getAddress() << " & ";
      _nTContentStream << netIt->second->getTypeID() << " & " << netIt->second->getMtu();
      if(netIt->second->isMulticast())
	_nTContentStream << " & ON\\\\\\hline" << std::endl;
      else
	_nTContentStream << " & OFF\\\\\\hline" << std::endl;
    }
    return netStream.str();
  }
\end{lstlisting}
\begin{lst}
\caption{Implementación de una de las funciones del backend.}
\label{lst:generateLink}
\end{lst}
\par

Una vez que se tienen generados todos los archivos, se genera el
gráfico llamando a una de las herramientas que componen
\emph{graphviz} como puede verse en el listado ~\ref{lst:genGraph}
\newpage
\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\begin{lstlisting}
  void
  BackendI::makeGraph()
  {
    string fName = _fileName.substr(0, _fileName.find_first_of("."));
    _dotStream << "digraph " << fName << "{" << std::endl << std::endl;
    _dotStream << GRAPH_PREAM_0 << fName << GRAPH_PREAM_1 << std::endl << std::endl;
    _dotStream << generateHosts() << generateRouters() << generateNets() << std::endl;
    _dotStream << _linkStream.str() << std::endl;
    _dotStream << "}" << std::endl;

    string tmpFileName = fName + string(".tmp");
    string outFileName = fName + "." + _outType;
    char* nullP = 0;

    // Genera un archivo temporal para la generacion del grafico
    ofstream tmpFileStream(tmpFileName.c_str());
    tmpFileStream << _dotStream.str();
    tmpFileStream.flush();
    tmpFileStream.close();

    int pid = fork();
    if(pid == 0){
      // Genera el grafico.
      execlp(GRAPH_CMD, GRAPH_CMD, "-T", _outType.c_str(), "-o" , outFileName.c_str(), tmpFileName.c_str(), nullP);
    } else {
      int v;
      // Genera las tablas.
      makeTables();
      wait(&v);
      // Elimina el archivo temporal.
      remove(tmpFileName.c_str());
    }
  }
\end{lstlisting}
\begin{lst}
\caption{Generación del gráfico de salida.}
\label{lst:genGraph}
\end{lst}
\par
\newpage
La generación de los archivos ~\LaTeX se muestra en el listado
~\ref{lst:genlatex}

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\begin{lstlisting}
  void
  BackendI::makeTables()
  {

    // Tabla de redes.
    ostringstream netStream;
    netStream << NET_TABLE_PREAM << _nTContentStream.str();
    netStream << "\\caption{Tabla de redes correspondiente a \\emph{" << _fileName << "}}" << std::endl;
    netStream << "\\label{tbl:net_" << _fileName << "}" << std::endl;
    netStream << "\\end{tabular}" << std::endl;

    string netFileName = string("net_") + _fileName + string(".tex");

    // Guarda la tabla.
    ofstream netFileStream(netFileName.c_str());
    netFileStream << netStream.str();
    netFileStream.flush();
    netFileStream.close();
    
    // Tabla de rutas.
    ostringstream routeStream;
    routeStream << ROUTE_TABLE_PREAM << _rTContentStream.str();
    routeStream << "\\caption{Tabla de rutas correspondiente a \\emph{" << _fileName << "}}" << std::endl;
    routeStream << "\\label{tbl:route_" << _fileName << "}" << std::endl;
    routeStream << "\\end{tabular}" << std::endl;

    string routeFileName = string("route_") + _fileName + string(".tex");

    // Guarda la tabla.
    ofstream routeFileStream(routeFileName.c_str());
    routeFileStream << routeStream.str();
    routeFileStream.flush();
    routeFileStream.close();
  }
\end{lstlisting}
\begin{lst}
\caption{Generación de los archivos \LaTeX.}
\label{lst:genlatex}
\end{lst}
\par
\newpage
En el listado ~\ref{lst:backendh} se muestra la declaración del
backend

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\lstinputlisting[numbers=left, language=c++]{../../src/BackendI.h}
\begin{lst}
\caption{Parte declarativa del backend.}
\label{lst:backendh}
\end{lst}
\par
